{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Simple example of TuRBO-m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from turbo import TurboM\n",
    "import numpy as np\n",
    "import torch\n",
    "import math\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Set up an optimization problem class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Levy:\n",
    "    def __init__(self, dim=10):\n",
    "        self.dim = dim\n",
    "        self.lb = -5 * np.ones(dim)\n",
    "        self.ub = 10 * np.ones(dim)\n",
    "        \n",
    "    def __call__(self, x):\n",
    "        assert len(x) == self.dim\n",
    "        assert x.ndim == 1\n",
    "        assert np.all(x <= self.ub) and np.all(x >= self.lb)\n",
    "        w = 1 + (x - 1.0) / 4.0\n",
    "        val = np.sin(np.pi * w[0]) ** 2 + \\\n",
    "            np.sum((w[1:self.dim - 1] - 1) ** 2 * (1 + 10 * np.sin(np.pi * w[1:self.dim - 1] + 1) ** 2)) + \\\n",
    "            (w[self.dim - 1] - 1) ** 2 * (1 + np.sin(2 * np.pi * w[self.dim - 1])**2)\n",
    "        return val\n",
    "\n",
    "f = Levy(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create a Turbo optimizer instance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using dtype = torch.float64 \n",
      "Using device = cpu\n"
     ]
    }
   ],
   "source": [
    "turbo_m = TurboM(\n",
    "    f=f,  # Handle to objective function\n",
    "    lb=f.lb,  # Numpy array specifying lower bounds\n",
    "    ub=f.ub,  # Numpy array specifying upper bounds\n",
    "    n_init=10,  # Number of initial bounds from an Symmetric Latin hypercube design\n",
    "    max_evals=1000,  # Maximum number of evaluations\n",
    "    n_trust_regions=5,  # Number of trust regions\n",
    "    batch_size=10,  # How large batch size TuRBO uses\n",
    "    verbose=True,  # Print information from each batch\n",
    "    use_ard=True,  # Set to true if you want to use ARD for the GP kernel\n",
    "    max_cholesky_size=2000,  # When we switch from Cholesky to Lanczos\n",
    "    n_training_steps=50,  # Number of steps of ADAM to learn the hypers\n",
    "    min_cuda=1024,  # Run on the CPU for small datasets\n",
    "    device=\"cpu\",  # \"cpu\" or \"cuda\"\n",
    "    dtype=\"float64\",  # float64 or float32\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Run the optimization process"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TR-0 starting from: 24.79\n",
      "TR-1 starting from: 20.77\n",
      "TR-2 starting from: 14.87\n",
      "TR-3 starting from: 27.97\n",
      "TR-4 starting from: 23.89\n",
      "80) New best @ TR-2: 12.43\n",
      "90) New best @ TR-2: 6.42\n",
      "110) New best @ TR-2: 5.467\n",
      "180) New best @ TR-2: 2.888\n",
      "230) New best @ TR-1: 1.944\n",
      "280) New best @ TR-1: 1.54\n",
      "310) New best @ TR-1: 1.052\n",
      "340) New best @ TR-1: 1.038\n",
      "390) New best @ TR-1: 0.9689\n",
      "410) New best @ TR-1: 0.877\n",
      "420) New best @ TR-1: 0.7794\n",
      "460) New best @ TR-1: 0.7509\n",
      "470) New best @ TR-1: 0.7264\n",
      "480) New best @ TR-1: 0.7238\n",
      "530) New best @ TR-1: 0.7044\n",
      "540) New best @ TR-1: 0.695\n",
      "550) New best @ TR-1: 0.6823\n",
      "560) New best @ TR-1: 0.6656\n",
      "590) New best @ TR-1: 0.6614\n",
      "600) New best @ TR-1: 0.6604\n",
      "640) TR-1 converged to: : 0.6604\n",
      "640) TR-1 is restarting from: : 23.66\n"
     ]
    }
   ],
   "source": [
    "turbo_m.optimize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Extract all evaluations from Turbo and print the best"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best value found:\n",
      "\tf(x) = 0.660\n",
      "Observed at:\n",
      "\tx = [-2.968  1.072  0.173  0.973  3.698  0.883  0.946  0.872  0.006  0.927]\n"
     ]
    }
   ],
   "source": [
    "X = turbo_m.X  # Evaluated points\n",
    "fX = turbo_m.fX  # Observed values\n",
    "ind_best = np.argmin(fX)\n",
    "f_best, x_best = fX[ind_best], X[ind_best, :]\n",
    "\n",
    "print(\"Best value found:\\n\\tf(x) = %.3f\\nObserved at:\\n\\tx = %s\" % (f_best, np.around(x_best, 3)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot the progress\n",
    "\n",
    "TuRBO-5 converges to a solution close to the global optimum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(7, 5))\n",
    "matplotlib.rcParams.update({'font.size': 16})\n",
    "plt.plot(fX, 'b.', ms=10)  # Plot all evaluated points as blue dots\n",
    "plt.plot(np.minimum.accumulate(fX), 'r', lw=3)  # Plot cumulative minimum as a red line\n",
    "plt.xlim([0, len(fX)])\n",
    "plt.ylim([0, 30])\n",
    "plt.title(\"10D Levy function\")\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
